#pragma once
#include "bn.h"

#define PUT(x) std::cout << #x << "\t=" << (x) << std::endl;

const struct Point {
    struct G2 {
        const char *aa;
        const char *ab;
        const char *ba;
        const char *bb;
    } g2;
    struct G1 {
        int a;
        int b;
    } g1;
} g_pointTbl[] = {
#ifdef BN_SUPPORT_SNARK
        // SNARK1(b = 3)
	{
		{
			"15267802884793550383558706039165621050290089775961208824303765753922461897946",
			"9034493566019742339402378670461897774509967669562610788113215988055021632533",
			"644888581738283025171396578091639672120333224302184904896215738366765861164",
			"20532875081203448695448744255224543661959516361327385779878476709582931298750",
		},
		{
			1, 2
		},
	},
	// SNARK2(b = 82)
	{
		{
			"7281644703356799059368313064438243279269372005747477888712173236228325795991",
			"15160700668152503952980485502602536850541312794041965342451842375663084147486",
			"13523979532236795535820810482891703536907572704519492618036353386190612673074",
			"15929067770616689398844794432758732907995965312283969374632681891490787470887",
		},
		{
			-1, 9
		},
	},
#else
        // Aranha
        {
                {
                        "12723517038133731887338407189719511622662176727675373276651903807414909099441",
                        "4168783608814932154536427934509895782246573715297911553964171371032945126671",
                        "13891744915211034074451795021214165905772212241412891944830863846330766296736",
                        "7937318970632701341203597196594272556916396164729705624521405069090520231616",
                },
                {
                        -1, 1
                },
        },
#endif
};

inline const Point& selectPoint(const bn::CurveParam& cp)
{
#ifdef BN_SUPPORT_SNARK
    if (cp.b != 3 && cp.b != 82) {
		printf("not support point for b=%d\n", cp.b);
		exit(1);
	}
	return g_pointTbl[cp.b == 3 ? 0 : 1];
#else
    if (cp != bn::CurveFp254BNb) {
        printf("not support except for CurveFp254BNb");
        exit(1);
    }
    return g_pointTbl[0];
#endif
}